# -*- coding: utf-8 -*-
"""
@author:xuyuntao
@time:2021/5/10:23:05
@email:xuyuntao@189.cn
"""
import numpy

def getBytesData(maxNum:int=16):
    """生成从0到输入参数maxNum（十进制）的二进制码元表示列表，每行对应一个十进制数字
    输入：最大数字
    输出：二进制序列"""
    if type(maxNum)==int:
        bitsDataList=[]
        maxBLen = len(bin(maxNum - 1).__str__()[2:])
        for _ in range(maxNum):
            bit = [__ for __ in bin(_).__str__()[2:]]
            bit_2 = ["0"] * (maxBLen - len(bit)) + bit
            bitsDataList.append(bit_2)
            del bit,bit_2
        bitsDataRow = numpy.array(bitsDataList, dtype=numpy.int8)
        del bitsDataList
        return bitsDataRow
    else:
        raise ValueError("输入最大数字必须为整数")

def getAllBytes(maxNum:int,bytesLen:int):
    """生成maxNum进制的bytesLen个码元序列，每行为一个码元的二进制表示
    为保证算法正确，这里加了限制，即bytesLen>=maxNum
    输入：最大进制数，码元长度
    输出：二进制序列"""
    if type(bytesLen)==int:
        if bytesLen<maxNum:
            raise ValueError("bytesLen必须大于等于maxNum")
        else:
            bytesData=getBytesData(maxNum)
            index=numpy.zeros(bytesLen,dtype=numpy.int32)
            index[:maxNum]=numpy.arange(maxNum)
            moreIndex=numpy.random.randint(0,maxNum,int(bytesLen-maxNum))
            index[maxNum:]=moreIndex
            return bytesData[numpy.random.permutation(index),:]
    else:
        raise ValueError("bytesLen必须为int类型")

def getBitsData(maxNum:int,bytesLen:int):
    """与getAllBytes类似，输入进制数和码元长度，不过输出为一维的二进制序列
    为保证算法正确，这里加了限制，即bytesLen>=maxNum
    输入：最大进制数，码元长度
    输出：二进制序列"""
    return getAllBytes(maxNum,bytesLen).reshape(-1)

if __name__=="__main__":
    print(getBytesData(16))
    print(getAllBytes(16,16))
    print(getBitsData(16,16))